-- Revisa porcentaje en de recepción de insumo cargado en la maceración

DROP TRIGGER tgr_check_porcentaje_recepcion_uva on traza.recepcion_maceracion;

CREATE OR REPLACE FUNCTION traza.check_porcentaje_recepcion_uva()
  RETURNS "trigger" AS
$BODY$
DECLARE
	r RECORD;
BEGIN	
	select into r sum(porcentaje) as total from traza.recepcion_maceracion 
	where codigo_recepcion_uva = new.codigo_recepcion_uva;
	if (r.total + new.porcentaje) > 100 then
		raise exception 'El porcentaje acumulado es mayor que el cien por ciento';
	end if;
	return new;

END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER tgr_check_porcentaje_recepcion_uva
  BEFORE INSERT
  ON traza.recepcion_maceracion
  FOR EACH ROW
  EXECUTE PROCEDURE traza.check_porcentaje_recepcion_uva();

-- Revisa porcentaje en de maceración cargado en la fermentación

DROP TRIGGER tgr_check_porcentaje_maceracion_fermentacion ON traza.maceracion_fermentacion;

DROP FUNCTION traza.check_porcentaje_maceracion_fermentacion();

CREATE OR REPLACE FUNCTION traza.check_porcentaje_maceracion_fermentacion()
  RETURNS "trigger" AS
$BODY$
DECLARE
	r RECORD;
BEGIN	
	select into r sum(porcentaje) as total from traza.maceracion_fermentacion
	where codigo_maceracion = new.codigo_maceracion;
	if (r.total + new.porcentaje) > 100 then
		raise exception 'El porcentaje acumulado es mayor que el cien por ciento';
	end if;
	return new;

END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER tgr_check_porcentaje_maceracion_fermentacion
  BEFORE INSERT
  ON traza.maceracion_fermentacion
  FOR EACH ROW
  EXECUTE PROCEDURE traza.check_porcentaje_maceracion_fermentacion();

-- Revisa porcentaje en de fermentación cargado en la mezcla

DROP TRIGGER tgr_check_porcentaje_fermentacion_mezcla ON traza.fermentacion_mezcla;

DROP FUNCTION traza.check_porcentaje_fermentacion_mezcla();

CREATE OR REPLACE FUNCTION traza.check_porcentaje_fermentacion_mezcla()
  RETURNS "trigger" AS
$BODY$
DECLARE
	r RECORD;
BEGIN	
	select into r sum(porcentaje) as total from traza.fermentacion_mezcla
	where codigo_fermentacion = new.codigo_fermentacion;
	if (r.total + new.porcentaje) > 100 then
		raise exception 'El porcentaje acumulado es mayor que el cien por ciento';
	end if;
	return new;

END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER tgr_check_porcentaje_fermentacion_mezcla
  BEFORE INSERT
  ON traza.fermentacion_mezcla
  FOR EACH ROW
  EXECUTE PROCEDURE traza.check_porcentaje_fermentacion_mezcla();

-- Revisa la cantidad de producto aplicado

DROP TRIGGER tgr_check_porcentaje_aplicacion_producto ON traza.aplicacion_producto;

DROP FUNCTION traza.check_porcentaje_aplicacion_producto();

CREATE OR REPLACE FUNCTION traza.check_porcentaje_aplicacion_producto()
  RETURNS "trigger" AS
$BODY$
DECLARE
	r RECORD;
	cantidad_recepcion float;
	cantidad_total float;
BEGIN	
	select into r cantidad_producto from traza.recepcion_insumo
	where codigo_recepcion_insumo = new.codigo_recepcion_insumo;
	
	cantidad_recepcion = r.cantidad_producto;
	
	select into r sum(cantidad) as total from traza.aplicacion_producto
	where codigo_recepcion_insumo = new.codigo_recepcion_insumo;
	
	cantidad_total := r.total + new.cantidad;

	if cantidad_total > cantidad_recepcion  then
		raise exception 'La cantidad a agregar sobrepasa la cantidad recibida.';
	end if;
	return new;

END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER tgr_check_porcentaje_aplicacion_producto
  BEFORE INSERT
  ON traza.aplicacion_producto
  FOR EACH ROW
  EXECUTE PROCEDURE traza.check_porcentaje_aplicacion_producto();

-- Revisa porcentaje de fermentación cargado en otras fermentaciones

DROP TRIGGER tgr_check_porcentaje_detalle_fermentacion ON traza.detalle_fermentacion;

DROP FUNCTION traza.check_porcentaje_detalle_fermentacion();

CREATE OR REPLACE FUNCTION traza.check_porcentaje_detalle_fermentacion()
  RETURNS "trigger" AS
$BODY$
DECLARE
	r RECORD;
BEGIN	
	select into r sum(porcentaje) as total from traza.detalle_fermentacion
	where codigo_relacion = new.codigo_relacion;
	if (r.total + new.porcentaje) > 100 then
		raise exception 'El porcentaje acumulado es mayor que el cien por ciento';
	end if;
	return new;

END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER tgr_check_porcentaje_detalle_fermentacion
  BEFORE INSERT
  ON traza.detalle_fermentacion
  FOR EACH ROW
  EXECUTE PROCEDURE traza.check_porcentaje_detalle_fermentacion();

-- Revisa porcentaje de mezclas en otras mezclas

DROP TRIGGER tgr_check_porcentaje_detalle_mezcla ON traza.detalle_mezcla;

DROP FUNCTION traza.check_porcentaje_detalle_mezcla();

CREATE OR REPLACE FUNCTION traza.check_porcentaje_detalle_mezcla()
  RETURNS "trigger" AS
$BODY$
DECLARE
	r RECORD;
BEGIN	
	select into r sum(porcentaje) as total from traza.detalle_mezcla
	where codigo_relacion = new.codigo_relacion;
	if (r.total + new.porcentaje) > 100 then
		raise exception 'El porcentaje acumulado es mayor que el cien por ciento';
	end if;
	return new;

END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER tgr_check_porcentaje_detalle_mezcla
  BEFORE INSERT
  ON traza.detalle_mezcla
  FOR EACH ROW
  EXECUTE PROCEDURE traza.check_porcentaje_detalle_mezcla();

-- Revisa porcentaje de mezclas que se ha embotellado

DROP TRIGGER tgr_check_porcentaje_mezcla_embotellado ON traza.mezcla_embotellado;

DROP FUNCTION traza.check_porcentaje_mezcla_embotellado();

CREATE OR REPLACE FUNCTION traza.check_porcentaje_mezcla_embotellado()
  RETURNS "trigger" AS
$BODY$
DECLARE
	r RECORD;
BEGIN	
	select into r sum(porcentaje) as total from traza.mezcla_embotellado
	where codigo_mezcla = new.codigo_mezcla;
	if (r.total + new.porcentaje) > 100 then
		raise exception 'El porcentaje acumulado es mayor que el cien por ciento';
	end if;
	return new;

END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER tgr_check_porcentaje_mezcla_embotellado
  BEFORE INSERT
  ON traza.mezcla_embotellado
  FOR EACH ROW
  EXECUTE PROCEDURE traza.check_porcentaje_mezcla_embotellado();